package com.netdisk.util;

import java.util.ArrayList;
import java.util.List;

import com.netdisk.entity.FileSystem;
import com.netdisk.entity.Group;
import com.netdisk.entity.User;

/**
 * 权限验证类
 * 
 * 企业用户才存在权限验证问题
 * 仿照linux权限管理: 7(rwo) 4(r) 2(w) 1(x) 0(无权限) 
 * @author chenlong
 *
 */
public class ConfirmPower {
	
	private FileSystem fileSystem;
	
	private List<Group> fileOwerGroups; // 文件的属主属于那些组

	private List<Group> groups; // 用户属于那些组

	private User user;

	public ConfirmPower(){}

	public ConfirmPower(User user, List<Group> groups, FileSystem fileSystem, List<Group> fileOwerGroups) {
		this();
		this.user = user;
		this.groups = groups;
		this.fileSystem = fileSystem;
		this.fileOwerGroups = fileOwerGroups;
	}

	public List<Group> getFileOwerGroups() {
		return fileOwerGroups;
	}

	public void setFileOwerGroups(List<Group> fileOwerGroups) {
		this.fileOwerGroups = fileOwerGroups;
	}

	public List<Group> getGroups() {
		return groups;
	}

	public void setGroups(List<Group> groups) {
		this.groups = groups;
	}

	public FileSystem getFileSystem() {
		return fileSystem;
	}

	public List<Group> getGroup() {
		return this.groups;
	}

	public User getUser() {
		return user;
	} 
	
	public void setFileSystem(FileSystem fileSystem) {
		this.fileSystem = fileSystem;
	}
	
	public void setGroup(List<Group> groups) {
		this.groups = groups;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
	/**
	 * 清除无关的组(组的企业和用户的企业不是同一家企业), 理论上传人的组不会是无关组,
	 */
	public void clearGroup (){
		String tempGroupCompanyId = "";
		String tempUserCompanyId = this.user.getCompanyId();
		
		for (int i = 0; i < this.groups.size(); i++) {
			tempGroupCompanyId = this.groups.get(i).getCompanyId(); 
			if ( ! tempGroupCompanyId.equals(tempUserCompanyId) ){ //如果不是一家企业
				this.groups.remove(i); //去掉不是一家企业的, 理论上传入的的groups的企业和user是一家企业.
			} 
		}
	}
	
	//是否在root组
	private boolean isRootGroup(){ //
		for (Group group : groups) {
			if(group.getGroupName().equalsIgnoreCase("root")){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 当前用户的组和文件的属主属于的组是同一组的话
	 * 就返回这些组
	 * @return
	 */
	private boolean commonOwerGroup(){ //
		String tempGroupsId = ""; // 组id
		for (Group group : this.groups) {
			tempGroupsId =group.getId();
			for (Group fg : fileOwerGroups) {
				if(tempGroupsId.equals(fg.getId())){
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * 是否可以读文件
	 * 读为4, 二级制100
	 * 
	 * @return
	 */
	public boolean isCanReadFile(){
		if(isRootGroup()){
			return true;
		}
		String ownerId = fileSystem.getOwnerId();
		
		String userId = user.getId();
		
		if(ownerId.equals(userId)){ // 文件的属主
			return true;
		}else if(commonOwerGroup()){ //文件同组
			//fileSystem.getPower() & 4
		}else{ //不同组 
			
		}
		
		this.clearGroup();
		
		return false;
	}
	
	/**
	 * 是否可以写文件
	 * @return
	 */
	public boolean isCanWriteFile(){
		if(isRootGroup()){
			return true;
		}
		return false;
	}
	
	/**
	 * 是否可以执行文件, 
	 * 对于文件时是可以打开,或者可以下载(无权限不显示) 
	 * 对于文件夹是可以进入
	 * @return
	 */
	public boolean isCanExeFile(){
		if(isRootGroup()){
			return true;
		}
		return false;
	}
	
}
